Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListViewModel.kt e330442dd5415dc7eb2bff4e3a3f1599c18022a1 (e330442d) Text, 10.91 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.node.list

Tff7b72import T7ee787androidx.lifecycle.SavedStateHandle
Tff7b72import T7ee787androidx.lifecycle.ViewModel
Tff7b72import T7ee787androidx.lifecycle.viewModelScope
Tff7b72import T7ee787kotlinx.coroutines.flow.Flow
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.StateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.combine
Tff7b72import T7ee787kotlinx.coroutines.flow.flatMapLatest
Tff7b72import T7ee787kotlinx.coroutines.flow.map
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787org.koin.core.annotation.KoinViewModel
Tff7b72import T7ee787org.meshtastic.core.common.util.MeasurementSystem
Tff7b72import T7ee787org.meshtastic.core.common.util.getSystemMeasurementSystem
Tff7b72import T7ee787org.meshtastic.core.model.DeviceType
Tff7b72import T7ee787org.meshtastic.core.model.Node
Tff7b72import T7ee787org.meshtastic.core.model.NodeAddress
Tff7b72import T7ee787org.meshtastic.core.model.NodeListDensity
Tff7b72import T7ee787org.meshtastic.core.model.NodeSortOption
Tff7b72import T7ee787org.meshtastic.core.model.util.DistanceUnit
Tff7b72import T7ee787org.meshtastic.core.repository.AdminController
Tff7b72import T7ee787org.meshtastic.core.repository.ConnectionStateProvider
Tff7b72import T7ee787org.meshtastic.core.repository.DeviceHardwareRepository
Tff7b72import T7ee787org.meshtastic.core.repository.NodeRepository
Tff7b72import T7ee787org.meshtastic.core.repository.RadioConfigRepository
Tff7b72import T7ee787org.meshtastic.core.repository.RadioInterfaceService
Tff7b72import T7ee787org.meshtastic.core.ui.viewmodel.stateInWhileSubscribed
Tff7b72import T7ee787org.meshtastic.feature.node.detail.NodeManagementActions
Tff7b72import T7ee787org.meshtastic.feature.node.detail.NodeRequestActions
Tff7b72import T7ee787org.meshtastic.feature.node.domain.usecase.GetFilteredNodesUseCase
Tff7b72import T7ee787org.meshtastic.proto.ChannelSet
Tff7b72import T7ee787org.meshtastic.proto.Config

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4)
Tf0883e@KoinViewModel
Tff7b72class T56d364NodeListViewModelTb4b4b4(
Tff7b72private Tff7b72val Te6edf3savedStateHandleTb4b4b4: Te6edf3SavedStateHandleTb4b4b4,
Tff7b72private Tff7b72val Te6edf3nodeRepositoryTb4b4b4: Te6edf3NodeRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3radioConfigRepositoryTb4b4b4: Te6edf3RadioConfigRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3connectionStateProviderTb4b4b4: Te6edf3ConnectionStateProviderTb4b4b4,
Tff7b72private Tff7b72val Te6edf3adminControllerTb4b4b4: Te6edf3AdminControllerTb4b4b4,
Tff7b72private Tff7b72val Te6edf3radioInterfaceServiceTb4b4b4: Te6edf3RadioInterfaceServiceTb4b4b4,
Tff7b72private Tff7b72val Te6edf3deviceHardwareRepositoryTb4b4b4: Te6edf3DeviceHardwareRepositoryTb4b4b4,
Tff7b72val Te6edf3nodeManagementActionsTb4b4b4: Te6edf3NodeManagementActionsTb4b4b4,
Tff7b72private Tff7b72val Te6edf3nodeRequestActionsTb4b4b4: Te6edf3NodeRequestActionsTb4b4b4,
Tff7b72private Tff7b72val Te6edf3getFilteredNodesUseCaseTb4b4b4: Te6edf3GetFilteredNodesUseCaseTb4b4b4,
Tff7b72val Te6edf3nodeFilterPreferencesTb4b4b4: Te6edf3NodeFilterPreferencesTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3ViewModelTb4b4b4(Tb4b4b4) Tb4b4b4{

Tff7b72val Te6edf3ourNodeInfoTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3Node?Tff7b72> Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3ourNodeInfo

Tff7b72val Te6edf3onlineNodeCount Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3onlineNodeCountTb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= T79c0ff0Tb4b4b4)

Tff7b72val Te6edf3totalNodeCount Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3totalNodeCountTb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= T79c0ff0Tb4b4b4)

Tff7b72val Te6edf3connectionState Tff7b72= Te6edf3connectionStateProviderTb4b4b4.Te6edf3connectionState

Tff7b72val Te6edf3deviceTypeTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3DeviceType?Tff7b72> Tff7b72=
Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3currentDeviceAddressFlow
Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3address Tff7b72-Tff7b72> Te6edf3addressTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3DeviceTypeTb4b4b4.Te6edf3fromAddressTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4} Tb4b4b4}
Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Tff7b72nullTb4b4b4)

Tff7b72val Te6edf3nodeListDensityTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3NodeListDensityTff7b72> Tff7b72=
Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3nodeListDensity
Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3name Tff7b72-Tff7b72> Te6edf3NodeListDensityTb4b4b4.Te6edf3fromNameTb4b4b4(Te6edf3nameTb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3NodeListDensityTb4b4b4.Te6edf3COMPLETETb4b4b4)

Tff7b72val Te6edf3shouldShowPower Tff7b72= Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3shouldShowPower
Tff7b72val Te6edf3shouldShowLastHeard Tff7b72= Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3shouldShowLastHeard
Tff7b72val Te6edf3lastHeardIsRelative Tff7b72= Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3lastHeardIsRelative
Tff7b72val Te6edf3shouldShowLocation Tff7b72= Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3shouldShowLocation
Tff7b72val Te6edf3shouldShowHops Tff7b72= Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3shouldShowHops
Tff7b72val Te6edf3shouldShowSignal Tff7b72= Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3shouldShowSignal
Tff7b72val Te6edf3shouldShowChannel Tff7b72= Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3shouldShowChannel
Tff7b72val Te6edf3shouldShowRole Tff7b72= Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3shouldShowRole
Tff7b72val Te6edf3shouldShowTelemetry Tff7b72= Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3shouldShowTelemetry

Tff7b72private Tff7b72val Te6edf3nodeSortOption Tff7b72= Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3nodeSortOption

Tff7b72private Tff7b72val Te6edf3_nodeFilterText Tff7b72= Te6edf3savedStateHandleTb4b4b4.Te6edf3getStateFlowTb4b4b4(Te6edf3KEY_FILTER_TEXTTb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3filterToggles Tff7b72=
Te6edf3combineTb4b4b4(
Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3includeUnknownTb4b4b4,
Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3excludeInfrastructureTb4b4b4,
Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3onlyOnlineTb4b4b4,
Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3onlyDirectTb4b4b4,
Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3showIgnoredTb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3includeUnknownTb4b4b4, Te6edf3excludeInfrastructureTb4b4b4, Te6edf3onlyOnlineTb4b4b4, Te6edf3onlyDirectTb4b4b4, Te6edf3showIgnored Tff7b72-Tff7b72>
Te6edf3NodeFilterTogglesTb4b4b4(
Te6edf3includeUnknown Tff7b72= Te6edf3includeUnknownTb4b4b4,
Te6edf3excludeInfrastructure Tff7b72= Te6edf3excludeInfrastructureTb4b4b4,
Te6edf3onlyOnline Tff7b72= Te6edf3onlyOnlineTb4b4b4,
Te6edf3onlyDirect Tff7b72= Te6edf3onlyDirectTb4b4b4,
Te6edf3showIgnored Tff7b72= Te6edf3showIgnoredTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72val Te6edf3nodeFilterTb4b4b4: Te6edf3FlowTff7b72<Te6edf3NodeFilterStateTff7b72> Tff7b72=
Te6edf3combineTb4b4b4(Te6edf3_nodeFilterTextTb4b4b4, Te6edf3filterTogglesTb4b4b4, Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3excludeMqttTb4b4b4) Tb4b4b4{
Te6edf3filterTextTb4b4b4,
Te6edf3filterTogglesTb4b4b4,
Te6edf3excludeMqttTb4b4b4,
Tff7b72-Tff7b72>
Te6edf3NodeFilterStateTb4b4b4(
Te6edf3filterText Tff7b72= Te6edf3filterTextTb4b4b4,
Te6edf3includeUnknown Tff7b72= Te6edf3filterTogglesTb4b4b4.Te6edf3includeUnknownTb4b4b4,
Te6edf3excludeInfrastructure Tff7b72= Te6edf3filterTogglesTb4b4b4.Te6edf3excludeInfrastructureTb4b4b4,
Te6edf3onlyOnline Tff7b72= Te6edf3filterTogglesTb4b4b4.Te6edf3onlyOnlineTb4b4b4,
Te6edf3onlyDirect Tff7b72= Te6edf3filterTogglesTb4b4b4.Te6edf3onlyDirectTb4b4b4,
Te6edf3showIgnored Tff7b72= Te6edf3filterTogglesTb4b4b4.Te6edf3showIgnoredTb4b4b4,
Te6edf3excludeMqtt Tff7b72= Te6edf3excludeMqttTb4b4b4,
Tb4b4b4)
Tb4b4b4}

T8b949e// OS locale rarely changes mid-session; snapshot once instead of per filter/sort emission.
Tff7b72private Tff7b72val Te6edf3distanceUnits Tff7b72= Te6edf3DistanceUnitTb4b4b4.Te6edf3getFromLocaleTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3value
Tff7b72private Tff7b72val Te6edf3tempInFahrenheit Tff7b72= Te6edf3getSystemMeasurementSystemTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3MeasurementSystemTb4b4b4.Te6edf3IMPERIAL
Tff7b72val Te6edf3nodesUiStateTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3NodesUiStateTff7b72> Tff7b72=
Te6edf3combineTb4b4b4(Te6edf3nodeSortOptionTb4b4b4, Te6edf3nodeFilterTb4b4b4) Tb4b4b4{ Te6edf3sortTb4b4b4, Te6edf3nodeFilter Tff7b72-Tff7b72>
Te6edf3NodesUiStateTb4b4b4(
Te6edf3sort Tff7b72= Te6edf3sortTb4b4b4,
Te6edf3filter Tff7b72= Te6edf3nodeFilterTb4b4b4,
Te6edf3distanceUnits Tff7b72= Te6edf3distanceUnitsTb4b4b4,
Te6edf3tempInFahrenheit Tff7b72= Te6edf3tempInFahrenheitTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3NodesUiStateTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72val Te6edf3nodeListTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3NodeTff7b72>Tff7b72> Tff7b72=
Te6edf3combineTb4b4b4(Te6edf3nodeFilterTb4b4b4, Te6edf3nodeSortOptionTb4b4b4, Tff7b72::Te6edf3PairTb4b4b4)
Tb4b4b4.Te6edf3flatMapLatest Tb4b4b4{ Tb4b4b4(Te6edf3filterTb4b4b4, Te6edf3sortTb4b4b4) Tff7b72-Tff7b72> Te6edf3getFilteredNodesUseCaseTb4b4b4.Te6edf3invokeTb4b4b4(Te6edf3filterTb4b4b4, Te6edf3sortTb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72val Te6edf3unfilteredNodeListTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3NodeTff7b72>Tff7b72> Tff7b72=
Te6edf3nodeRepositoryTb4b4b4.Te6edf3getNodesTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_deviceImageUrls Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3MapTff7b72<Tffa657IntTb4b4b4, Tffa657StringTff7b72>Tff7b72>Tb4b4b4(Te6edf3emptyMapTb4b4b4(Tb4b4b4)Tb4b4b4)

T8b949e/** Maps hw_model int value → device image URL from the flasher CDN. */
Tff7b72val Te6edf3deviceImageUrlsTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MapTff7b72<Tffa657IntTb4b4b4, Tffa657StringTff7b72>Tff7b72> Tff7b72= Te6edf3_deviceImageUrlsTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72init Tb4b4b4{
T8b949e// Resolve device image URLs as nodes arrive
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3nodeListTb4b4b4.Te6edf3collect Tb4b4b4{ Te6edf3nodes Tff7b72-Tff7b72>
Tff7b72val Te6edf3newModels Tff7b72= Te6edf3nodesTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3userTb4b4b4.Te6edf3hw_modelTb4b4b4.Te6edf3value Tb4b4b4}Tb4b4b4.Te6edf3distinctTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657it Tff7b72!in Te6edf3_deviceImageUrlsTb4b4b4.Te6edf3value Tb4b4b4}
Tff7b72for Tb4b4b4(Te6edf3hwModel Tff7b72in Te6edf3newModelsTb4b4b4) Tb4b4b4{
Te6edf3resolveDeviceImageUrlTb4b4b4(Te6edf3hwModelTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffresolveDeviceImageUrlTb4b4b4(Te6edf3hwModelTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3hw Tff7b72= Te6edf3deviceHardwareRepositoryTb4b4b4.Te6edf3getDeviceHardwareByModelTb4b4b4(Te6edf3hwModelTb4b4b4)Tb4b4b4.Te6edf3getOrNullTb4b4b4(Tb4b4b4) Tff7b72?: Tff7b72return
Tff7b72val Te6edf3imageFile Tff7b72= Te6edf3hwTb4b4b4.Te6edf3imagesTff7b72?.Te6edf3getOrNullTb4b4b4(T79c0ff1Tb4b4b4) Tff7b72?: Te6edf3hwTb4b4b4.Te6edf3imagesTff7b72?.Te6edf3getOrNullTb4b4b4(T79c0ff0Tb4b4b4) Tff7b72?: Tff7b72return
Tff7b72val Te6edf3url Tff7b72= Ta5d6ff"Tffd700$Te6edf3FLASHER_DEVICE_IMAGE_BASE_URLTffd700$Te6edf3imageFileTa5d6ff"
Te6edf3_deviceImageUrlsTb4b4b4.Te6edf3value Tff7b72= Te6edf3_deviceImageUrlsTb4b4b4.Te6edf3value Tff7b72+ Tb4b4b4(Te6edf3hwModel Te6edf3to Te6edf3urlTb4b4b4)
Tb4b4b4}

Tff7b72var Te6edf3nodeFilterTextTb4b4b4: Tffa657String
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3_nodeFilterTextTb4b4b4.Te6edf3value
Tff7b72setTb4b4b4(Te6edf3valueTb4b4b4) Tb4b4b4{
Te6edf3savedStateHandleTff7b72[Te6edf3KEY_FILTER_TEXTTff7b72] Tff7b72= Te6edf3value
Tb4b4b4}

Tff7b72fun Td2a8ffsetSortOptionTb4b4b4(Te6edf3sortTb4b4b4: Te6edf3NodeSortOptionTb4b4b4) Tb4b4b4{
Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3setNodeSortTb4b4b4(Te6edf3sortTb4b4b4)
Tb4b4b4}

Tff7b72fun Td2a8ffsetChannelsTb4b4b4(Te6edf3channelSetTb4b4b4: Te6edf3ChannelSetTb4b4b4) Tff7b72= Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3replaceAllSettingsTb4b4b4(Te6edf3channelSetTb4b4b4.Te6edf3settingsTb4b4b4)
Tff7b72val Te6edf3newLoraConfig Tff7b72= Te6edf3channelSetTb4b4b4.Te6edf3lora_config
Tff7b72if Tb4b4b4(Te6edf3newLoraConfig Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3adminControllerTb4b4b4.Te6edf3setLocalConfigTb4b4b4(Te6edf3ConfigTb4b4b4(Te6edf3lora Tff7b72= Te6edf3newLoraConfigTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8fffavoriteNodeTb4b4b4(Te6edf3nodeTb4b4b4: Te6edf3NodeTb4b4b4) Tff7b72= Te6edf3nodeManagementActionsTb4b4b4.Te6edf3requestFavoriteNodeTb4b4b4(Te6edf3viewModelScopeTb4b4b4, Te6edf3nodeTb4b4b4)

Tff7b72fun Td2a8ffignoreNodeTb4b4b4(Te6edf3nodeTb4b4b4: Te6edf3NodeTb4b4b4) Tff7b72= Te6edf3nodeManagementActionsTb4b4b4.Te6edf3requestIgnoreNodeTb4b4b4(Te6edf3viewModelScopeTb4b4b4, Te6edf3nodeTb4b4b4)

Tff7b72fun Td2a8ffmuteNodeTb4b4b4(Te6edf3nodeTb4b4b4: Te6edf3NodeTb4b4b4) Tff7b72= Te6edf3nodeManagementActionsTb4b4b4.Te6edf3requestMuteNodeTb4b4b4(Te6edf3viewModelScopeTb4b4b4, Te6edf3nodeTb4b4b4)

Tff7b72fun Td2a8ffremoveNodeTb4b4b4(Te6edf3nodeTb4b4b4: Te6edf3NodeTb4b4b4) Tff7b72= Te6edf3nodeManagementActionsTb4b4b4.Te6edf3requestRemoveNodeTb4b4b4(Te6edf3viewModelScopeTb4b4b4, Te6edf3nodeTb4b4b4)

T8b949e/** Returns the contact key for navigating to a direct message conversation with this node. */
Tff7b72fun Td2a8ffgetDirectMessageRouteTb4b4b4(Te6edf3nodeTb4b4b4: Te6edf3NodeTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3ourNode Tff7b72= Te6edf3ourNodeInfoTb4b4b4.Te6edf3value
Tff7b72val Te6edf3hasPKC Tff7b72= Te6edf3ourNodeTff7b72?.Te6edf3hasPKC Tff7b72=Tff7b72= Tff7b72true Tff7b72&Tff7b72& Te6edf3nodeTb4b4b4.Te6edf3hasPKC
Tff7b72val Te6edf3channel Tff7b72= Tff7b72if Tb4b4b4(Te6edf3hasPKCTb4b4b4) Te6edf3NodeAddressTb4b4b4.Te6edf3PKC_CHANNEL_INDEX Tff7b72else Te6edf3nodeTb4b4b4.Te6edf3channel
Tff7b72return Ta5d6ff"Tffd700${Te6edf3channelTffd700}Tffd700${Te6edf3nodeTb4b4b4.Te6edf3userTb4b4b4.Te6edf3idTffd700}Ta5d6ff"
Tb4b4b4}

T8b949e/** Initiates a trace route request to the specified node. */
Tff7b72fun Td2a8fftraceRouteTb4b4b4(Te6edf3nodeTb4b4b4: Te6edf3NodeTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3nodeRequestActionsTb4b4b4.Te6edf3requestTracerouteTb4b4b4(Te6edf3nodeTb4b4b4.Te6edf3numTb4b4b4, Te6edf3nodeTb4b4b4.Te6edf3userTb4b4b4.Te6edf3long_nameTb4b4b4) Tb4b4b4}
Tb4b4b4}

Tff7b72companion Tff7b72object Tb4b4b4{
Tff7b72private Tff7b72const Tff7b72val Te6edf3KEY_FILTER_TEXT Tff7b72= Ta5d6ff"Ta5d6fffilter_textTa5d6ff"
Tff7b72private Tff7b72const Tff7b72val Te6edf3FLASHER_DEVICE_IMAGE_BASE_URL Tff7b72= Ta5d6ff"Ta5d6ffhttps://flasher.meshtastic.org/img/devices/Ta5d6ff"
Tb4b4b4}
Tb4b4b4}

Tff7b72data Tff7b72class T56d364NodesUiStateTb4b4b4(
Tff7b72val Te6edf3sortTb4b4b4: Te6edf3NodeSortOption Tff7b72= Te6edf3NodeSortOptionTb4b4b4.Te6edf3LAST_HEARDTb4b4b4,
Tff7b72val Te6edf3filterTb4b4b4: Te6edf3NodeFilterState Tff7b72= Te6edf3NodeFilterStateTb4b4b4(Tb4b4b4)Tb4b4b4,
Tff7b72val Te6edf3distanceUnitsTb4b4b4: Tffa657Int Tff7b72= T79c0ff0Tb4b4b4,
Tff7b72val Te6edf3tempInFahrenheitTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4)

Tff7b72data Tff7b72class T56d364NodeFilterStateTb4b4b4(
Tff7b72val Te6edf3filterTextTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Tff7b72val Te6edf3includeUnknownTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72trueTb4b4b4,
Tff7b72val Te6edf3excludeInfrastructureTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tff7b72val Te6edf3onlyOnlineTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tff7b72val Te6edf3onlyDirectTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tff7b72val Te6edf3showIgnoredTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tff7b72val Te6edf3excludeMqttTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4) Tb4b4b4{
T8b949e/** True if any user-applied filter is narrowing the visible node set. Unknown nodes are shown unless opted out. */
Tff7b72val Te6edf3isActiveTb4b4b4: Tffa657Boolean
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72=
Tff7b72!Te6edf3includeUnknown Tff7b72|Tff7b72|
Te6edf3filterTextTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3excludeInfrastructure Tff7b72|Tff7b72|
Te6edf3onlyOnline Tff7b72|Tff7b72|
Te6edf3onlyDirect Tff7b72|Tff7b72|
Te6edf3excludeMqtt
Tb4b4b4}

Tff7b72data Tff7b72class T56d364NodeFilterTogglesTb4b4b4(
Tff7b72val Te6edf3includeUnknownTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72trueTb4b4b4,
Tff7b72val Te6edf3excludeInfrastructureTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tff7b72val Te6edf3onlyOnlineTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tff7b72val Te6edf3onlyDirectTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tff7b72val Te6edf3showIgnoredTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4)

Served by rngit 1.5.0 - Generated in 0.09s